﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.IO;
using IBS;

namespace HQCSupplierCodeLoader
{
    public partial class Service1 : ServiceBase
    {

        private Timer timer = null;

        public Service1()
        {
            InitializeComponent();

            try
            {
                if (!EventLog.SourceExists(this.ServiceName + "_log"))
                    EventLog.CreateEventSource(this.ServiceName, this.ServiceName + "_log");
            }
            catch { }

            serviceLog.Source = this.ServiceName + "_log";
            serviceLog.Log = this.ServiceName + "_log";

        }

        protected override void OnStart(string[] args)
        {
            serviceLog.WriteEntry(this.ServiceName + " запущен");

            Properties.Settings.Default.Reload();

            var ExecuteTimes = Properties.Settings.Default.ExecuteTimes;

            if (Properties.Settings.Default.ExecuteImmediately)
                ExecuteTimes.Add(DateTime.Now.AddMinutes(1).ToString("HH:mm"));

            timer = new Timer();
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = TimerUtil.GetNewTimerInterval(ExecuteTimes);
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
            serviceLog.WriteEntry(this.ServiceName + " остановлен");

            timer.Stop();
            timer.Close();
        }

        /// <summary>
        /// При срабатывании таймера
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            // Останавливаем таймей и стартуем выполнение выгрузки
            timer.Stop();

            Process();

            // Интервал таймера
            Properties.Settings.Default.Reload();
            timer.Interval = TimerUtil.GetNewTimerInterval(Properties.Settings.Default.ExecuteTimes);
            timer.Start();
        }

        private void Process()
        {
            try
            {
                serviceLog.WriteEntry("Запуск процедуры загрузки файлов Supplier_Code", EventLogEntryType.Information);
                Properties.Settings.Default.Reload();
                //тестовая загрузка 1го файла
                string path = Properties.Settings.Default.Path;
                string connectionString = Properties.Settings.Default.IBSConnectionString;

                if (Directory.Exists(path))
                {
                    var files = Directory.GetFiles(path, "Supplier_Code*.txt", SearchOption.TopDirectoryOnly);
                    if (files.Length > 0)
                    {
                        serviceLog.WriteEntry(String.Format("Найдено {0} фалов для загрузки",files.Length), EventLogEntryType.Information);
                        foreach (var file in files)
                        {
                            FileInfo fi = new FileInfo(file);
                            try
                            {                                
                                var parser = new HQCSupplierFileParser.Parser(fi.FullName);
                                var result = parser.parseFile();
                                var ibs = new IBS.IbsDataContext(connectionString);
                                var siteCode = result.FirstOrDefault().SITECODE;
                                ibs.DeleteHQCSupplierCode(siteCode);
                               
                                foreach (HQCSUPPLIER_CODE line in result)
                                {
                                    try
                                    {
                                        ibs.SaveHQCSupplierCode(line);
                                    }
                                    catch (Exception ex)
                                    {
                                        serviceLog.WriteEntry(String.Format("При попытке сохранить строку из файла {0}, произошла ошибка: {1}",fi.FullName,ex.Message), EventLogEntryType.Error); 
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                serviceLog.WriteEntry(String.Format("При обработке файла {0}, произошла ошибка: {1}", fi.FullName, ex.Message), EventLogEntryType.Error); 
                            }
                        }
                        serviceLog.WriteEntry("Загрузка файлов Supplier_Code завершена успешно", EventLogEntryType.Information);
                    }
                }
                else
                {
                    serviceLog.WriteEntry("Недоступна папка обмена (" + path + ")",EventLogEntryType.Warning);
                }                
            }
            catch (Exception ex)
            {
                serviceLog.WriteEntry(String.Format("В процедуре загрузки файлов Supplier_Code произошла ошибка: {0}", ex.Message), EventLogEntryType.Error); 
            }
        }        
    }
}
